#include <exam.h>
#include <stdio.h>

typedef enum {
    E_Idle,
    E_Status1,
    E_Status2,
    E_StatusUnkonwn,
} FsmStatusType;

typedef enum {
    E_InputDefault,
    E_Input1,
    E_Input2,
    E_InputUnkonwn,
} FsmInputType;

// implement by app
void ProcessCurrentState(FsmStatusType curState, FsmInputType input)
{
    printf("[status] currentStatus: %d, input %d\n", curState, input);
}

// handles
FsmStatusType GetNextStatusForIdle(FsmInputType input)
{
    switch (input) {
    case E_Input1:
        return E_Status2;
    case E_Input2:
        return E_Status1;
    default:
        return E_StatusUnkonwn;
    }
}

FsmStatusType GetNextStatusForStatus1(FsmInputType input)
{

    // ...
    return E_StatusUnkonwn;
}

FsmStatusType GetNextStatusForStatus2(FsmInputType input)
{

    // ...
    return E_StatusUnkonwn;
}
FsmStatusType GetNextStatus(FsmStatusType cur, FsmInputType input)
{
    switch (cur) {
    case E_Status1:
        return GetNextStatusForStatus1(input);
    case E_Status2:
        return GetNextStatusForStatus2(input);
    default:
        return GetNextStatusForIdle(input);
    }
}

void RunFsmForTest()
{
    FsmStatusType status, nextStatus;

    status = E_StatusUnkonwn;

    FsmInputType PesoduInputs[] = {E_Input1, E_Input2};
    int          i;
    int          inputLen = sizeof(PesoduInputs) / sizeof(FsmInputType);
    for (i = 0; i < inputLen; i++) {
        ProcessCurrentState(status, PesoduInputs[i]);
        nextStatus = GetNextStatus(status, PesoduInputs[i]);
        printf("[status] nextStatus: %d\n", nextStatus);
    }
}
